package dao

import (
	"database/sql"
	"goseckill/common"
	"goseckill/models"
	"log"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type IProduct interface {
	Conn() error //连接数据
	Insert(*models.Product) (int64, error)
	Delete(int64) bool
	Update(*models.Product) error
	SelectByKey(int64) (*models.Product, error)
	SelectAll() ([]*models.Product, error)
	SubProductNum(productID int64) error
}

// 接口实现类
type ProductManager struct{
	table string
	conn *gorm.DB
}

// NewProductManager 创建构造函数
func NewProductManager(table string, db *sql.DB) IProduct {
	gormDB,err  :=gorm.Open(mysql.New(mysql.Config{
		Conn: db,
	}), &gorm.Config{})  // 根据现有数据库连接创建
	if err!=nil {log.Fatal(err)}

	return &ProductManager{table: table, conn:gormDB }
}

// 具体实现

// Conn 数据连接
func (p *ProductManager) Conn() (err error) {
	if p.conn == nil {
		mysqlConn, err := common.NewGormMysqlConn()
		if err != nil {
			return err
		}
		p.conn = mysqlConn
	}
	return
}

// Insert 插入
func (p *ProductManager) Insert(product *models.Product) (productId int64, err error) {
	if err = p.Conn(); err != nil {
		return
	}
	productStruct := &models.Product{
		ProductName:  product.ProductName,
		ProductNum:   product.ProductNum,
		ProductImage: product.ProductImage,
		ProductUrl:   product.ProductUrl,
	}
	err = p.conn.Create(&productStruct).Error
	return productStruct.ID, err
}

// Delete 商品的删除
func (p *ProductManager) Delete(productID int64) bool {
	if err := p.Conn(); err != nil {
		return false
	}
	// 根据主键删除
	err := p.conn.Delete(&models.Product{}, productID).Error

	return err==nil
}

// Update 商品的更新
func (p *ProductManager) Update(product *models.Product) error {
	if err := p.Conn(); err != nil {
		return err
	}

	productStruct := &models.Product{}
	res := p.conn.First(&productStruct, product.ID)
	if res.Error != nil {
		return res.Error
	}

	productStruct.ProductName = product.ProductName
	productStruct.ProductNum = product.ProductNum
	productStruct.ProductImage = product.ProductImage
	productStruct.ProductUrl = product.ProductUrl
	// 保存 更新
	res = p.conn.Save(&productStruct)
	if res.Error != nil {
		return res.Error
	}
	return nil
}

// SelectByKey 根据商品ID查询商品
func (p *ProductManager) SelectByKey(productID int64) (productResult *models.Product, err error) {
	if err := p.Conn(); err != nil {
		return &models.Product{}, err
	}

	productResult = &models.Product{}
	res := p.conn.First(&productResult, productID)
	if res.Error != nil {
		return &models.Product{}, res.Error
	}
	return
}

// SelectAll 获取所有商品
func (p *ProductManager) SelectAll() (productArray []*models.Product, errProduct error) {
	if err := p.Conn(); err != nil {
		return []*models.Product{}, err
	}

	var products []*models.Product
	p.conn.Table("product").Find(&products) // 结构体的复数寻找表名
	for _, v := range products {
		productArray = append(productArray, v)
	}
	return
}

func (p *ProductManager) SubProductNum(productID int64) error {
	if err := p.Conn(); err != nil {
		return err
	}

	productStruct := &models.Product{}
	res := p.conn.Table("product").First(&productStruct, productID)
	if res.Error != nil {
		return res.Error
	}
	productStruct.ProductNum = productStruct.ProductNum - 1
	res = p.conn.Table("product").Save(&productStruct)
	if res.Error != nil {
		return res.Error
	}
	return nil
}

